# 自动取款机系统
from db.model import Model

'''
数据库
create database if not exists myatmdb;

use myatmdb;

create table atm(
    id int unsigned not null auto_increment PRIMARY KEY ,
    card_num varchar(19) not null,
    password varchar(6) not null,
    menoy int unsigned default 0,
    error tinyint unsigned default 0);

insert into atm values
 (null,'6222600260001072444','100860',20000,0),
 (null,'6222600840000938602','100860',18800,0),
 (null,'6222600000001788266','100860',36000,0);

'''

'''
定义一个用于存放用户信息的列表变量
id 主键
card_num 卡号
password 密码
menoy 卡里面的钱
error 密码输入错误的次数，连输错误三次将会锁卡
'''


# 验证密码
def input_password(mod, id):
    '''
    验证密码
    :param mod:模型
    :param id: 主键id
    :return:
    '''

    dlist = mod.find(id)
    error = dlist['error']  # 获取错误次数
    password = dlist['password']  # 获取密码

    while True:
        # 输入密码登陆
        if error >= 3:
            print('对不起，当前银行卡因为密码连续错误3次，现已锁定。')
            print('')
            return False

        text = input('请输入密码(100860)：')
        if text == password:
            # 登陆成功后，需要修改错误次数为0
            print('登陆成功')
            mod.update({"id": id, "error": "0"})
            return True
        else:
            print('密码错误，你还有{0}次机会'.format(3 - error - 1))
            error += 1
            mod.update({"id": id, "error": error})


# 选择插入的银行卡,并输入密码
def select_card(mod):
    # 读取银行卡的卡号
    dlist = mod.findAll()
    if len(dlist) == 0:
        print('醒醒，你并没有银行卡！')
        return

    num_list = []  # 记录银行卡的序号
    id_list = []  # 记录数据库的主键id
    for i in range(len(dlist)):  # 列出银行卡
        line = dlist[i]
        print('{0}. {1}'.format(i + 1, line.get('card_num')))
        num_list.append(str(i + 1))
        id_list.append(line.get('id'))

    while True:
        key = input('请选择银行卡：')
        if key not in num_list:
            print('无效的序号')
        else:
            list_index = int(key) - 1  # 列表的序号
            id = id_list[list_index]
            if not input_password(mod, id):
                return  # 登陆失败
            else:
                # 登陆成功，跳出循环
                break

    # 登陆成功后的操作：存款，取款，查询余额还有退出

    while True:
        card_dict = mod.find(id)  # 获取当前选择卡号的信息字典
        menoy = card_dict['menoy']  # 余额

        print('=' * 8, '欢迎使用本系统', '=' * 8)
        print('{0}{1:14}{2:13}'.format(' ', '1. 查询余额', '2. 存款'))
        print('{0}{1:15}{2:13}'.format(' ', '3. 取款', '4. 退出'))
        print('=' * 29)
        key = input('请输入对应的选择：')
        if key == '1':
            print("=" * 12, "余额查询", "=" * 12)
            print('当前余额为：{0}'.format(menoy))
            input("按回车键继续：")

        elif key == '2':
            print("=" * 12, "存款", "=" * 12)
            num = int(input('请输入你要存入的金额：'))
            if num <= 0:
                print('错误，不允许存入负数或者0')
                continue
            menoy = menoy + num  # 获取剩余的钱
            mod.update({"id": id, "menoy": menoy})
            input("存款成功，按回车键继续")

        elif key == '3':
            print("=" * 12, "取款", "=" * 12)
            num = int(input('请输入你要取的金额：'))
            if num <= 0:
                print('错误，不允许取负数或者0')
                continue

            if num > menoy:
                print('错误，你要取的钱太多了，卡里面不够')
                continue

            menoy = menoy - num  # 获取剩余的钱
            mod.update({"id": id, "menoy": menoy})
            input("取款完成，潇洒去吧，按回车键继续")

        elif key == '4':
            print('=' * 8, '退出系统', '=' * 15)
            print('')
            break


# 程序主入口
if __name__ == '__main__':
    mod = Model('atm')
    while True:
        # 输出初始界面
        print('=' * 8, '自动取款机系统', '=' * 8)
        print('{0}{1:7}{2:7}'.format(' ', '1. 登陆', '2. 退出'))
        print('=' * 29)
        key = input('请输入对应的选择：')
        if key == '1':
            print('=' * 8, '登陆系统', '=' * 13)
            select_card(mod)
        elif key == '2':
            print('=' * 8, '退出系统', '=' * 13)
            print('')
        else:
            print('无效的输入')
